package br.urca.impl;

import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;

import br.urca.dao.BiAutoresMateriaisDAO;
import br.urca.model.BiAutoresMateriais;

@Transactional
public class JPABiAutoresMateriaisDAO implements BiAutoresMateriaisDAO {
	
	private EntityManager manager;
	
	public JPABiAutoresMateriaisDAO() {
		this(null);
	}
	
	@Inject
	public JPABiAutoresMateriaisDAO(EntityManager manager) {
		this.manager = manager;
	}

	@Override
	public List<BiAutoresMateriais> getListPorTitulo(String titulo) {
		return this.manager
				.createQuery(
						"SELECT b FROM BiAutoresMateriais b WHERE b.material.titulo LIKE '%" + titulo + "%'",
						BiAutoresMateriais.class)
				.getResultList();
	}

	@Override
	public List<BiAutoresMateriais> getListPorArea(String area) {
		return this.manager
				.createQuery(
						"SELECT b FROM BiAutoresMateriais b WHERE b.material.area LIKE '%" + area + "%'",
						BiAutoresMateriais.class)
				.getResultList();
	}

	@Override
	public List<BiAutoresMateriais> getListPorAutor(String autor) {
		return this.manager
				.createQuery(
						"SELECT b FROM BiAutoresMateriais b WHERE b.autor.nome LIKE '%" + autor + "%'",
						BiAutoresMateriais.class)
				.getResultList();
	}

	@Override
	public List<BiAutoresMateriais> getListPorTitulo(String filtro,
			Character tipoMaterial) {
		return this.manager
				.createQuery(
						"SELECT b FROM BiAutoresMateriais b WHERE b.material.titulo LIKE '%" + filtro + "%' "
								+ " AND b.biAutoresMateriaisPK.codTipoMaterial = :tipo",
						BiAutoresMateriais.class).setParameter("tipo", tipoMaterial)
				.getResultList();
	}

	@Override
	public List<BiAutoresMateriais> getListPorArea(String area,
			Character tipoMaterial) {
		return this.manager
				.createQuery(
						"SELECT b FROM BiAutoresMateriais b WHERE b.material.area LIKE '%" + area + "%' "
								+ " AND b.biAutoresMateriaisPK.codTipoMaterial = :tipo",
						BiAutoresMateriais.class)
				.setParameter("tipo", tipoMaterial).getResultList();
	}

	@Override
	public List<BiAutoresMateriais> getListPorAutor(String autor,
			Character tipoMaterial) {
		return this.manager
				.createQuery(
						"SELECT b FROM BiAutoresMateriais b WHERE b.autor.nome LIKE '%" + autor + "%' " 
								+ " AND b.biAutoresMateriaisPK.codTipoMaterial = :tipo",
						BiAutoresMateriais.class)
				.setParameter("tipo", tipoMaterial).getResultList();
	}

	@Override
	public BiAutoresMateriais getListPorTipoNumeroMaterial(
			Character tipoMaterial, int numeroMaterial) {
		try {
			return this.manager
					.createQuery(
							"SELECT b FROM BiAutoresMateriais b WHERE "
									+ " b.biAutoresMateriaisPK.codTipoMaterial = :tipo "
									+ " AND b.biAutoresMateriaisPK.codNumeroMaterial = :cod ",
							BiAutoresMateriais.class)
					.setParameter("tipo", tipoMaterial)
					.setParameter("cod", numeroMaterial).getResultList().get(0);
		} catch(Exception e) {
			return null;
		}
	}

}
